

<html>

  <head>

  </head>

  <body>

  </body>

  <script>

  // 至于“闭包”这个词的概念的文字描述，确实不好解释，我看过很多遍，但是现在还是记不住。

// 但是你只需要知道应用的两种情况即可——函数作为返回值，函数作为参数传递。

// 第一，函数作为返回值

function fn(){
  var max= 10;
  return function bar(x){
    console.log(x)
    if(max>x){
      console.log(x)
    }else{
      console.log(max)
    }
  }
}

var f1 = fn();
f1(15)

// 第二，函数作为参数被传递

var max =10,
fn2 = function(x){
  if(x>max){
    console.log(x)
  }else{
    console.log(max)
  }
}

(function(f){
  var max=100
  f(15)

})(fn2)

// 如上代码中，fn函数作为一个参数被传递进入另一个函数，赋值给f参数。执行f(15)时，max变量的取值是10，而不是100。


// 上一节讲到自由变量跨作用域取值时，曾经强调过：要去创建这个函数的作用域取值，而不是“父作用域”。理解了这一点，以上两端代码中，自由变量如何取值应该比较简单。（不明白的朋友一定要去上一节看看，这个很重要！）

 

// 另外，讲到闭包，除了结合着作用域之外，还需要结合着执行上下文栈来说一下。

// 在前面讲执行上下文栈时（http://www.cnblogs.com/wangfupeng1988/p/3989357.html），我们提到当一个函数被调用完成之后，
//其执行上下文环境将被销毁，其中的变量也会被同时销毁。


  // 重点重点
  // 但是在当时那篇文章中留了一个问号——有些情况下，函数调用完成之后，其执行上下文环境不会接着被销毁。
  //这就是需要理解闭包的核心内容


  </script>
</html>

